#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include "info.h"
#include "error.h"
#include "config.h"
#include "courseselection.h"
#include "course.h"
#include "student.h"
#include "xlsxdocument.h"
#include <QMap>

QT_BEGIN_NAMESPACE
namespace Ui {
class Widget;
}
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

private:
    void init();               // 初始化页面数据
    void initStackedWidget();  // 初始化窗口栈
    void initConnect();        // 初始化信号和槽

    bool loadCourse();         // 加载课程分数
    bool loadCharity();        // 加载公益分
    bool loadConduct();        // 加载操行分
    QVariant readCellValue(QXlsx::Document& xlsx, const int row, const int col, const bool readVal=true);   // 得到公式的值

    void showCourse();         // 显示所有录入的课程信息
    void showCharity();        // 显示公益分
    void showConduct();        // 显示操行分
    void showStudent();        // 显示所有学生的信息
    void showAll();            // 显示所有信息

    bool calculate(GradeLevel gradeLevel);           // 最终计算
    double calculateCharityGrade(int charityGrade);  // 根据公益分，计算公益分成绩

    void setClassId(const QString &arg1, const QString &arg2, int arg3); // 自动识别并且设置 年级 和 班级号
    bool save(QString title, QString table, GradeLevel gradeLevel);      // 导出

private slots:
    void on_start_year_textChanged(const QString &arg1);  // 开始时间
    void on_end_year_textChanged(const QString &arg1);    // 结束时间
    void on_grade_num_textChanged(const QString &arg1);   // 年级
    void on_class_num_textChanged(const QString &arg1);   // 班级
    void on_class_info_activated(int index);              // 专业
    void on_btn_course_score_clicked();                   // 选择成绩单
    void on_btn_charity_score_clicked();                  // 选择公益分
    void on_btn_conduct_score_clicked();                  // 选择操行分
    void on_btn_start_clicked();                          // 开始计算
    void on_btn_show_info_clicked();                      // 显示信息
    void on_btn_show_error_clicked();                     // 显示错误信息
    void on_btn_clear_info_clicked();                     // 清空信息
    void on_btn_clear_error_clicked();                    // 清空错误信息

signals:
    void appendInfoMessage(const QString msg);     // 保存普通信息
    void clearInfoMessage();                       // 清空普通信息
    void appendErrorMessage(const QString msg);    // 保存错误信息
    void clearErrorMessage();                      // 清空错误信息

private slots:
    void dealSelectedCourseList(const QList<Course> courseList);      // 处理返回的课程列表

private:
    Ui::Widget              *ui;
    Info                    *info;               // 信息输出窗口
    Error                   *error;              // 错误信息输出窗口
    CourseSelection         *cs;                 // 课程选择窗口
    Config                  config;              // 配置
    QString                 courseScorePath;     // 课程成绩
    QString                 charityScorePath;    // 公益分
    QString                 conductScorePath;    // 操行分
    QList<Course>           courseList;          // 课程列表
    QMap<QString, Student>  students;            // 学生列表
};
#endif // WIDGET_H
